package com.system.connect.springboot_flowers.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.system.connect.springboot_flowers.dto.OrderCreateDTO;
import com.system.connect.springboot_flowers.entity.Order;
import com.system.connect.springboot_flowers.entity.OrderItem;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

public interface OrderService extends IService<Order> {
    /**
     * 创建订单
     */
    Order createOrder(OrderCreateDTO orderCreateDTO, Long userId);

    /**
     * 根据ID获取订单
     */
    Order getOrderById(Long id);

    /**
     * 更新订单状态
     */
    Order updateOrderStatus(Long id, Integer status);

    /**
     * 根据订单号获取订单
     */
    Order getByOrderNo(String orderNo);

    /**
     * 获取订单列表
     */
    List<Order> getOrderList(Long userId, Integer status, Integer page, Integer size);
    
    /**
     * 统计订单总数
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单总数
     */
    int countOrders(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 统计指定状态的订单数量
     * @param status 订单状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单数量
     */
    int countOrdersByStatus(Integer status, LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 统计订单总金额
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单总金额
     */
    double sumOrderAmount(LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取销售最多的花种
     * @param limit 返回数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 花种销售排行
     */
    List<Map<String, Object>> getTopSellingFlowers(int limit, LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 获取销售趋势
     * @param days 天数
     * @return 销售趋势数据
     */
    List<Map<String, Object>> getSalesTrend(int days);
    
    /**
     * 获取订单详情（包含订单项）
     * @param orderId 订单ID
     * @return 订单详情，包含订单项列表
     */
    Map<String, Object> getOrderDetail(Long orderId);
    
    /**
     * 取消订单
     * @param orderId 订单ID
     * @param reason 取消原因
     * @return 取消后的订单
     */
    Order cancelOrder(Long orderId, String reason);
    
    /**
     * 批量更新订单状态
     * @param orderIds 订单ID列表
     * @param status 目标状态
     * @return 更新结果
     */
    boolean batchUpdateOrderStatus(List<Long> orderIds, Integer status);
    
    /**
     * 获取订单的订单项
     * @param orderId 订单ID
     * @return 订单项列表
     */
    List<OrderItem> getOrderItems(Long orderId);
    
    /**
     * 按照用户消费金额统计用户排行
     * @param limit 返回数量
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 用户消费排行
     */
    List<Map<String, Object>> getUserRankByAmount(int limit, LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 导出订单数据
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param status 状态（可选）
     * @return 文件路径
     */
    String exportOrders(LocalDateTime startTime, LocalDateTime endTime, Integer status);
}
